#pragma once
#include "FloatExpressionNode.hpp"
#include "IntegerExpressionNode.hpp"
namespace Level4
{
	template <typename _Ty, typename _Base = Level4::ExpressionNode>
	class TypeExpressionNode :
		public _Base
	{
	public:
		const _Ty value;
		TypeExpressionNode() = default;
		inline TypeExpressionNode(const _Ty val) :
			value(val)
		{
		}
		TypeExpressionNode(const TypeExpressionNode&) = delete;
		TypeExpressionNode& operator=(const TypeExpressionNode&) = delete;
		virtual ~TypeExpressionNode() = default;
		virtual inline ExpressionNode* Optimize()override
		{
			return this;
		}
		/*_Ty inline operator _Ty()const
		{
			return value;
		}*/
	};
	using SignedInteger8ExpressionNode = TypeExpressionNode<signed char, IntegerExpressionNode>;
	using SignedInteger16ExpressionNode = TypeExpressionNode<signed short, IntegerExpressionNode>;
	using SignedInteger32ExpressionNode = TypeExpressionNode<signed int, IntegerExpressionNode>;
	using SignedInteger64ExpressionNode = TypeExpressionNode<signed long long, IntegerExpressionNode>;
	using UnsignedInteger8ExpressionNode = TypeExpressionNode<unsigned char, IntegerExpressionNode>;
	using UnsignedInteger16ExpressionNode = TypeExpressionNode<unsigned short, IntegerExpressionNode>;
	using UnsignedInteger32ExpressionNode = TypeExpressionNode<unsigned int, IntegerExpressionNode>;
	using UnsignedInteger64ExpressionNode = TypeExpressionNode<unsigned long long, IntegerExpressionNode>;
	using Integer8ExpressionNode = SignedInteger8ExpressionNode;
	using Integer16ExpressionNode = SignedInteger16ExpressionNode;
	using Integer32ExpressionNode = SignedInteger32ExpressionNode;
	using Integer64ExpressionNode = SignedInteger64ExpressionNode;
	using Float4ExpressionNode = TypeExpressionNode<float, FloatExpressionNode>;
	using Float8ExpressionNode = TypeExpressionNode<double, FloatExpressionNode>;
}